package com.yunchen.server.exception;

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import com.yunchen.server.util.Return;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理器
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 处理未登录异常
     */
    @ExceptionHandler(NotLoginException.class)
    public Return handleNotLoginException(NotLoginException e) {
        Return re = new Return();
        
        // 根据不同的未登录类型返回不同的错误信息
        String message = e.getMessage();
        if (message.contains("未能读取到有效 token")) {
            re.setMsg("请先登录");
            re.setCode(401);
        } else if (message.contains("token已过期")) {
            re.setMsg("登录已过期，请重新登录");
            re.setCode(401);
        } else if (message.contains("token无效")) {
            re.setMsg("登录凭证无效，请重新登录");
            re.setCode(401);
        } else {
            re.setMsg("未登录，请先登录");
            re.setCode(401);
        }
        
        return re;
    }

    /**
     * 处理权限不足异常
     */
    @ExceptionHandler(NotPermissionException.class)
    public Return handleNotPermissionException(NotPermissionException e) {
        Return re = new Return();
        re.setCode(403);
        re.setMsg("权限不足，无法访问该资源");
        return re;
    }

    /**
     * 处理角色不足异常
     */
    @ExceptionHandler(NotRoleException.class)
    public Return handleNotRoleException(NotRoleException e) {
        Return re = new Return();
        re.setCode(403);
        re.setMsg("角色权限不足，无法访问该资源");
        return re;
    }

    /**
     * 处理其他异常
     */
    @ExceptionHandler(Exception.class)
    public Return handleException(Exception e) {
        Return re = new Return();
        re.setCode(500);
        re.setMsg("系统内部错误");
        e.printStackTrace(); // 打印异常堆栈，便于调试
        return re;
    }
}
